Negative Zahlen
Wenn wir den Befehl H
des Debug Programms ausprobiert
haben, könnten wir etwas sonderbares
entdecken. Wenn wir 3 von 2 subtrachieren, erhalten wir nicht
–1, sondern FFFFh. Probieren wir noch
einmal diese Werte aus. Wenn wir FFFFh zum Dezimalsystem
umwandeln, bekommen wir 65535. Was hat das mit
–1 zu tun? Der Befehl H 5 FFFF ergibt 4 und 6,
also FFFFh benehmt sich als
–1. Versuchen wir die
Addition dieser zwei Werten auf Papier auszuführen:
0005h
+
FFFFh
-------
10004h
Wenn wir den, als fünfte Ziffer bekommene 1-er nicht in Rücksicht nehmen (genau wie
es das Debug Programm macht), erhalten wir das richtige Ergebnis. FFFFh benehmt sich also als –1, wenn
wir den "Überlauf"
nicht in Rücksicht nehmen. Wir nennen
es Überlauf (overflow), weil die Zahl
eigentlich fünf Ziffern hat, das Debug behaltet aber nur vier
davon.
Ist das jetzt ein Überlauf-Fehler oder ist das Ergebnis
richtig? Eigentlich beides ist
Recht. Ist
das aber kein Wiederspruch? Eigentlich nicht, weil
wir diese Zahlen aus Zwei
verschiedene Sichtpunkte betrachten können. Nehmen wir an,
dass FFFFh ist gleich 65535. Das ist eine
positive Zahl, und zugleich
die grösseste Zahl was wir mit vier
hexa Ziffern ausdrücken können. Wir sagen, dass
FFFFh eine vorzeichenlose Zahl ist. In diesem
Fall, wenn wir zu FFFFh 5 addieren,
erhalten wir 10004h, keine andere Antwort
ist richtig. Im Fall den vorzeichenlosen Zahlen tritt also ein Überlauf-Fehler auf.
Von dem anderen Sichtpunkt können wir FFFFh als negative Zahl interpretieren, wie das Debug es getan hat, wenn
wir den H Befehl benützt haben. FFFFh benehmt sich
als –1, wenn
wir den Überlauf nicht in Rücksicht nehmen. Eigentlich benehmen sich alle
Zahlen zwischen 8000h und FFFFh als
negative Zahlen. Im Fall der Zahlen mit
Vorzeichen ist
der Überlauf kein Fehler. Der
Mikroprozessor kann die Zahlen als
vorzeichenlose oder als Zahlen mit
Vorzeichen behandeln, wir können wählen.
Schauen wir uns die Form der negativen Zahlen
an:
-positive Zahlen:
0000h 0000 0000 0000 0000b
...
...
7FFFh 0111 1111 1111
1111b
-negative Zahlen:
8000h 1000 0000 0000
0000b
...
...
FFFFh
1111 1111 1111 1111b
Wir können entdecken, dass im Fall der
positven Zahlen ist das höchstwertige
Bit (15ste Bit) immer 0, weil
im Fall der negativen Zahlen ist es immer
1. Dieser Unterschied berichtet den Mikroprozessor darüber, weder eine Zahl negativ
oder positv
ist: er schaut
das 15ste Bit (das Vorzeichenbit) an.
Diese negative Zahlen sind die sogenannte Zweier-Komplemente der positiven Zahlen (sie komplementieren die gegebene positive Zahl zu 10000h). Der Rechner stellt die negative Zahlen in (Zweier-)Komplementdarstellung dar. Wir können
die Umwandlung zwischen den
Kods der positiven und negativen Zahlen in zwei verschiedenen Arten durchführen: entweder durch Subtraktion von 10000h, oder formell,
in zwei Schritte: wir invenrtieren jede Ziffer der
binären Zahl (statt 0 schreiben wir 1, und statt 1 schreiben wir 0), dann addieren wir
1 dazu.
Zum Beispiel: wir bekommen volgenderweise
die Komplementdarstellung von -3C8h:
3C8h = 0000 0011 1100 1000b
im erster Schritt erhalten wir 1111 1100 0011 0111 ,
dann
1111 1100 0011 0111+
1
---------------------------------
-3C8h =
1111 1100 0011 1000b = FC38h
Wir können das Ergebnis
mit der Hilfe
von Debug überprüfen, wenn wir 3C8 von 0 subtrachieren. Ebenso erhalten wir die entsprechende positive Zahl vom Komplementdarstellung einer negativen Zahl.